package com.rustic.server.service;

import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
import cn.xy.commons.enums.YesNoStatus;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.rustic.server.dto.user.UpdatePersonalDTO;
import com.rustic.server.dto.user.UserUpdateDTO;
import com.rustic.server.po.User;
import com.rustic.server.query.UserAdminListQuery;
import com.rustic.server.vo.user.UserListVO;
import com.rustic.server.vo.user.UserSimpleVO;
import me.chanjar.weixin.common.bean.WxOAuth2UserInfo;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

/**
 * 表[user]对应的服务类
 *
 * @author auto
 */

public interface UserService extends IService<User> {

    String USER_NOT_EXIST = "用户不存在";

    /**
     * token内保存的参数
     */
    String USER_ID = "id";


    int MAX_LOCATION = 1;

    /**
     * 24小时不操作即退出
     */
    int MAX_LIFE = 24 * 60 * 60;

    String LOGIN_PREFIX = "user_";

    /**
     * 查询（根据ID 批量查询）
     *
     * @param idList id列表
     * @return 用户列表
     */
    List<User> listByIdIn(List<Integer> idList);

    /**
     * 查询（根据ID 批量查询）并转换成Map
     *
     * @param idList id列表
     * @return 用户列表
     */
    Map<Integer, User> mapByIdIn(List<Integer> idList);

    /**
     * 登陆
     *
     * @param ip   ip
     * @param user user
     * @return token
     */
    String login(String ip, User user);

    /**
     * 生成token
     *
     * @param user user
     * @return token
     */
    String createJwt(User user);

    /**
     * 修改登陆记录
     *
     * @param id id
     * @param ip ip
     */
    void updateLastLoginInfo(Integer id, String ip);

    /**
     * 获取vo类
     *
     * @param id id
     * @return UserVO
     */
    UserSimpleVO getSimpleById(Integer id);

    /**
     * 通过微信登陆信息创建用户
     *
     * @param appId    appId
     * @param userInfo 微信返回的用户信息
     * @param openId   openId
     * @param ip       ip
     * @return User
     */
    User createByWxMaUserInfo(String appId, WxMaUserInfo userInfo, String openId, String ip);

    /**
     * 通过账号获取用户
     *
     * @param account username/mobile
     * @return User
     */
    User getByMatch(String account);

    /**
     * 通过手机号获取用户
     *
     * @param mobile mobile
     * @return User
     */
    User getByMobile(String mobile);

    /**
     * 通过用户名获取用户
     *
     * @param nickname username
     * @return User
     */
    User getByNickname(String nickname);

    /**
     * 更新手机号
     *
     * @param userId   userId
     * @param mobile   mobile
     * @param verified 是否通过验证
     */
    void updateMobile(int userId, String mobile, YesNoStatus verified);

    /**
     * 通过微信登陆信息创建用户
     *
     * @param appId            appId
     * @param wxOauth2UserInfo 微信返回的用户信息
     * @param ip               ip
     * @return User
     */
    User createByWxOauth2UserInfo(String appId, WxOAuth2UserInfo wxOauth2UserInfo, String ip);

    /**
     * 退出登陆
     *
     * @param userId userId
     */
    void logout(int userId);

    /**
     * 密码生成
     *
     * @param password password
     * @param salt     salt
     * @return encodePassword
     */
    String encodePassword(String password, String salt);

    /**
     * 修改密码
     *
     * @param id       用户id
     * @param password 密码
     */
    void updatePassword(Integer id, String password);

    /**
     * 手机号绑定
     *
     * @param userId
     * @param mobile
     */
    void bindMobile(int userId, String mobile);

    /**
     * 判断用户是否登陆
     *
     * @param userId userId
     * @param token  token
     * @return 是否登陆
     */
    boolean isLogin(int userId, String token);

    /**
     * 延长登陆有效时间
     *
     * @param userId userId
     */
    void renewLogin(int userId);

    /**
     * 通过手机号注册
     *
     * @param account       account
     * @param password      password
     * @param ip            ip
     * @param nationalityId nationalityId
     * @return User
     */
    User addUserByAccount(String account, String password, String ip, Integer nationalityId);

    /**
     * 用户信息查询
     *
     * @param userQuery 查询条件
     * @return Page<UserVO>
     */
    Page<UserListVO> getPageList(UserAdminListQuery userQuery);

    /**
     * 更新
     *
     * @param userUpdateDTO userUpdateDTO
     */
    @Transactional(rollbackFor = Exception.class)
    void updateUser(UserUpdateDTO userUpdateDTO);

    void updateStatusBatchById(List<Integer> ids, String status);

    /**
     * 根据邮件获取用户信息
     *
     * @param email 邮件
     * @return User user
     */
    User getByEmail(String email);

    /**
     * 检查手机号或邮件是否有重复的
     *
     * @param mobile 手机号
     * @param email  邮箱
     * @param userId 用户id
     */
    void checkMobileAndEmail(String mobile, String email, int userId);

    /**
     * 用户修改个人资料
     *
     * @param updatePersonalDTO updatePersonalDTO
     * @param userId            userId
     */
    void updateUserToWeb(UpdatePersonalDTO updatePersonalDTO, int userId);
}
